package com.black.play.component.base;

import javax.swing.*;
import java.awt.*;

/**
 * 消息弹框以及确认框
 *
 * @author ylx
 */
public class AppMessageBox
{
    /**
     * 提示信息
     *
     * @param message 内容
     */
    public static void info(String message)
    {
        info(null, "info", message);
    }

    /**
     * 提示信息
     *
     * @param title   标题
     * @param message 内容
     */
    public static void info(String title, String message)
    {
        info(null, title, message);
    }

    /**
     * 提示信息
     *
     * @param container 容器 可以为null 可以为null
     * @param title     标题
     * @param message   内容
     */
    public static void info(Component container, String title, String message)
    {
        JOptionPane.showMessageDialog(container, message, title, JOptionPane.INFORMATION_MESSAGE);
    }

    /**
     * 警告信息
     *
     * @param message 内容
     */
    public static void warn(String message)
    {
        warn(null, "warn", message);
    }

    /**
     * 警告信息
     *
     * @param title   标题
     * @param message 内容
     */
    public static void warn(String title, String message)
    {
        warn(null, title, message);
    }

    /**
     * 警告信息
     *
     * @param container 容器 可以为null
     * @param title     标题
     * @param message   内容
     */
    public static void warn(Component container, String title, String message)
    {
        JOptionPane.showMessageDialog(container, message, title, JOptionPane.WARNING_MESSAGE);
    }

    /**
     * 错误信息
     *
     * @param message 内容
     */
    public static void error(String message)
    {
        error(null, "error", message);
    }

    /**
     * 错误信息
     *
     * @param title   标题
     * @param message 内容
     */
    public static void error(String title, String message)
    {
        error(null, title, message);
    }

    /**
     * 错误信息
     *
     * @param container 容器 可以为null
     * @param title     标题
     * @param message   内容
     */
    public static void error(Component container, String title, String message)
    {
        JOptionPane.showMessageDialog(container, message, title, JOptionPane.ERROR_MESSAGE);
    }

    /**
     * 未知信息
     *
     * @param message 内容
     */
    public static void unknown(String message)
    {
        unknown(null, "unknown", message);
    }

    /**
     * 未知信息
     *
     * @param title   标题
     * @param message 内容
     */
    public static void unknown(String title, String message)
    {
        unknown(null, title, message);
    }

    /**
     * 未知信息
     *
     * @param container 容器 可以为null
     * @param title     标题
     * @param message   内容
     */
    public static void unknown(Component container, String title, String message)
    {
        JOptionPane.showMessageDialog(container, message, title, JOptionPane.QUESTION_MESSAGE);
    }

    /**
     * 消息提示
     *
     * @param message 内容
     */
    public static void message(String message)
    {
        message(null, "message", message);
    }

    /**
     * 消息提示
     *
     * @param title   标题
     * @param message 内容
     */
    public static void message(String title, String message)
    {
        message(null, title, message);
    }

    /**
     * 消息提示
     *
     * @param container 容器 可以为null
     * @param title     标题
     * @param message   内容
     */
    public static void message(Component container, String title, String message)
    {
        JOptionPane.showMessageDialog(container, message, title, JOptionPane.PLAIN_MESSAGE);
    }

    /**
     * 确认框  关闭无处理
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     */
    public static void confirm_yes(String title, String message, OptionCallback okCallback)
    {
        confirm_yes(null, title, message, okCallback, null);
    }

    /**
     * 确认框  关闭无处理
     *
     * @param container  容器 可以为null
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     */
    public static void confirm_yes(Component container, String title, String message, OptionCallback okCallback)
    {
        confirm_yes(container, title, message, okCallback, null);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param title         标题
     * @param message       内容
     * @param okCallback    点击是回调
     * @param closeCallback 点关闭回调
     */
    public static void confirm_yes(String title, String message, OptionCallback okCallback,
        OptionCallback closeCallback)
    {
        confirm_yes(null, title, message, okCallback, closeCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param container     容器
     * @param title         标题
     * @param message       内容
     * @param okCallback    点击是回调
     * @param closeCallback 点关闭回调
     */
    public static void confirm_yes(Component container, String title, String message, OptionCallback okCallback,
        OptionCallback closeCallback)
    {
        int option = JOptionPane.showConfirmDialog(container, message, title, JOptionPane.YES_OPTION);
        handle(option, okCallback, null, null, closeCallback);
    }

    /**
     * 确认框  关闭,否无处理
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     */
    public static void confirm_yes_no(String title, String message, OptionCallback okCallback)
    {
        confirm_yes_no(null, title, message, okCallback);
    }

    /**
     * 确认框  关闭,否无处理
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     */
    public static void confirm_yes_no(Component container, String title, String message, OptionCallback okCallback)
    {
        confirm_yes_no(container, title, message, okCallback, null);
    }

    /**
     * 确认框  对应选项回调为null不处理
     * 关闭处理同否
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     * @param noCallback 点击否回调
     *                   点关闭回调
     */
    public static void confirm_yes_no(String title, String message, OptionCallback okCallback,
        OptionCallback noCallback)
    {
        confirm_yes_no(null, title, message, okCallback, noCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     * 关闭处理同否
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     * @param noCallback 点击否回调
     *                   点关闭回调
     */
    public static void confirm_yes_no(Component container, String title, String message, OptionCallback okCallback,
        OptionCallback noCallback)
    {
        confirm_yes_no(container, title, message, okCallback, noCallback, noCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param title         标题
     * @param message       内容
     * @param okCallback    点击是回调
     * @param noCallback    点击否回调
     * @param closeCallback 点关闭回调
     */
    public static void confirm_yes_no(String title, String message, OptionCallback okCallback,
        OptionCallback noCallback, OptionCallback closeCallback)
    {
        confirm_yes_no(null, title, message, okCallback, noCallback, closeCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param container     容器
     * @param title         标题
     * @param message       内容
     * @param okCallback    点击是回调
     * @param noCallback    点击否回调
     * @param closeCallback 点关闭回调
     */
    public static void confirm_yes_no(Component container, String title, String message, OptionCallback okCallback,
        OptionCallback noCallback, OptionCallback closeCallback)
    {
        int option = JOptionPane.showConfirmDialog(container, message, title, JOptionPane.YES_NO_OPTION);
        handle(option, okCallback, noCallback, null, closeCallback);
    }

    /**
     * 确认框  关闭取消不处理
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     */
    public static void confirm_yes_cancel(String title, String message, OptionCallback okCallback)
    {
        confirm_yes_cancel(title, message, okCallback, null);
    }

    /**
     * 确认框  对应选项回调为null不处理
     * 关闭处理同取消
     *
     * @param title          标题
     * @param message        内容
     * @param okCallback     点击是回调
     * @param cancelCallback 点取消回调
     *                       点关闭回调
     */
    public static void confirm_yes_cancel(String title, String message, OptionCallback okCallback,
        OptionCallback cancelCallback)
    {
        confirm_yes_cancel(null, title, message, okCallback, cancelCallback, cancelCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param title          标题
     * @param message        内容
     * @param okCallback     点击是回调
     * @param cancelCallback 点取消回调
     * @param closeCallback  点关闭回调
     */
    public static void confirm_yes_cancel(String title, String message, OptionCallback okCallback,
        OptionCallback cancelCallback, OptionCallback closeCallback)
    {
        confirm_yes_cancel(null, title, message, okCallback, cancelCallback, closeCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param container      容器
     * @param title          标题
     * @param message        内容
     * @param okCallback     点击是回调
     * @param cancelCallback 点取消回调
     * @param closeCallback  点关闭回调
     */
    public static void confirm_yes_cancel(Component container, String title, String message, OptionCallback okCallback,
        OptionCallback cancelCallback, OptionCallback closeCallback)
    {
        int option = JOptionPane.showConfirmDialog(container, message, title, JOptionPane.YES_NO_OPTION);
        handle(option, okCallback, null, cancelCallback, closeCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     * 关闭取消不处理
     *
     * @param title      标题
     * @param message    内容
     * @param okCallback 点击是回调
     * @param noCallback 点击否回调
     */
    public static void confirm_yes_no_cancel(String title, String message, OptionCallback okCallback,
        OptionCallback noCallback)
    {
        confirm_yes_no_cancel(title, message, okCallback, noCallback, null);
    }

    /**
     * 确认框  对应选项回调为null不处理
     * 关闭处理同取消
     *
     * @param title          标题
     * @param message        内容
     * @param okCallback     点击是回调
     * @param noCallback     点击否回调
     * @param cancelCallback 点取消回调
     */
    public static void confirm_yes_no_cancel(String title, String message, OptionCallback okCallback,
        OptionCallback noCallback, OptionCallback cancelCallback)
    {
        confirm_yes_no_cancel(title, message, okCallback, noCallback, cancelCallback, cancelCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param title          标题
     * @param message        内容
     * @param okCallback     点击是回调
     * @param noCallback     点击否回调
     * @param cancelCallback 点取消回调
     * @param closeCallback  点关闭回调
     */
    public static void confirm_yes_no_cancel(String title, String message, OptionCallback okCallback,
        OptionCallback noCallback, OptionCallback cancelCallback, OptionCallback closeCallback)
    {
        confirm_yes_no_cancel(null, title, message, okCallback, noCallback, cancelCallback, closeCallback);
    }

    /**
     * 确认框  对应选项回调为null不处理
     *
     * @param container      容器
     * @param title          标题
     * @param message        内容
     * @param okCallback     点击是回调
     * @param noCallback     点击否回调
     * @param cancelCallback 点取消回调
     * @param closeCallback  点关闭回调
     */
    public static void confirm_yes_no_cancel(Component container, String title, String message,
        OptionCallback okCallback, OptionCallback noCallback, OptionCallback cancelCallback,
        OptionCallback closeCallback)
    {
        int option = JOptionPane.showConfirmDialog(container, message, title, JOptionPane.YES_NO_OPTION);
        handle(option, okCallback, noCallback, cancelCallback, closeCallback);
    }

    /**
     * 自定义确认框
     * 若回调数少于按钮数,选择多余的按钮按照关闭处理
     * 若没有关闭回调,则关闭不处理
     *
     * @param container     容器 可以为null
     * @param title         标题
     * @param message       内容
     * @param messageType   图标类型 参考JOptionPane
     * @param icon          自定义图标
     * @param options       按钮内容
     * @param closeCallback 关闭回调
     * @param callbacks     按钮回调
     * @see JOptionPane#ERROR_MESSAGE
     * @see JOptionPane#INFORMATION_MESSAGE
     * @see JOptionPane#WARNING_MESSAGE
     * @see JOptionPane#QUESTION_MESSAGE
     * @see JOptionPane#PLAIN_MESSAGE
     */
    public static void confirm_custom(Component container, String title, String message, Integer messageType,
        Icon icon, String[] options, OptionCallback closeCallback, OptionCallback... callbacks)
    {
        if (messageType == null)
        {
            messageType = JOptionPane.INFORMATION_MESSAGE;
        }
        int option = JOptionPane.showOptionDialog(
            container,
            message,
            title,
            JOptionPane.DEFAULT_OPTION,
            messageType, // 消息类型
            icon, // 自定义图标（null表示使用默认图标）
            options, // 自定义按钮内容
            options[0] // 默认选中的按钮
        );
        if (option < 0 || option >= callbacks.length)
        {
            if (closeCallback != null)
            {
                closeCallback.call();
            }
        }
        else
        {
            OptionCallback callback = callbacks[option];
            if (callback != null)
            {
                callback.call();
            }
        }
    }

    /**
     * 自定义消息框
     * 若回调数少于按钮数,选择多余的按钮按照关闭处理
     * 若没有关闭回调,则关闭不处理
     *
     * @param container     容器 可以为null
     * @param title         标题
     * @param message       内容
     * @param messageType   图标类型 参考JOptionPane
     * @param icon          自定义图标
     * @param buttonText    按钮内容
     * @param okCallback    按钮回调
     * @param closeCallback 关闭回调
     * @see JOptionPane#ERROR_MESSAGE
     * @see JOptionPane#INFORMATION_MESSAGE
     * @see JOptionPane#WARNING_MESSAGE
     * @see JOptionPane#QUESTION_MESSAGE
     * @see JOptionPane#PLAIN_MESSAGE
     */
    public static void message_custom(Component container, String title, String message, Integer messageType,
        Icon icon, String buttonText, OptionCallback okCallback, OptionCallback closeCallback)
    {
        if (messageType == null)
        {
            messageType = JOptionPane.INFORMATION_MESSAGE;
        }
        int option = JOptionPane.showOptionDialog(
            container,
            message,
            title,
            JOptionPane.YES_OPTION,
            messageType, // 消息类型
            icon, // 自定义图标（null表示使用默认图标）
            new String[] {buttonText}, // 自定义按钮内容
            buttonText // 默认选中的按钮
        );
        handle(option, okCallback, null, null, closeCallback);
    }

    private static void handle(int option, OptionCallback okCallback, OptionCallback noCallback,
        OptionCallback cancelCallback, OptionCallback closeCallback)
    {
        switch (option)
        {
            case JOptionPane.YES_OPTION:
                if (okCallback != null)
                    okCallback.call();
                break;
            case JOptionPane.NO_OPTION:
                if (noCallback != null)
                    noCallback.call();
                break;
            case JOptionPane.CANCEL_OPTION:
                if (cancelCallback != null)
                    cancelCallback.call();
                break;
            case JOptionPane.CLOSED_OPTION:
                if (closeCallback != null)
                    closeCallback.call();
                break;
        }
    }

    @FunctionalInterface
    public interface OptionCallback
    {
        void call();
    }
}
